﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

class MyInteger
{
	friend ostream& operator<<(ostream& cout, const MyInteger& myInt);
public:
	MyInteger()
	{
		m_Num = 0;
	}

	//2.前置++重载；
	MyInteger& operator++()
		//MyInteger operator++()
	{
		this->m_Num++;
		return *this;
	}
	//3.后置++重载；
	MyInteger operator++(int)
	{
		//4.先保存目前数据；
		MyInteger tmp = *this;
		m_Num++;
		return tmp;
	}

	int m_Num;
};

ostream& operator<<(ostream& cout, const MyInteger& myInt)
{
	cout << myInt.m_Num;
	return cout;
}

void testInDecrease()
{
	MyInteger myInt;
	//1.前置++，后置++；
	//++myInt;
	//cout << ++myInt << endl;//1

	//6.前置++返回的不是值，而是引用，此时myInt的值还是1，不会被修改；而a为int，不是MyInteger，int类型如下：
	//2.加入const后，编译器的处理方式为：int tmp=10; const int& ref=tmp;
	//const int& ref = 10;	看似是返回值，其实编译器内部已经处理成引用了；
	cout << ++(++myInt) << endl;//0 --> 2
	cout << myInt << endl;//2 --> 2

	//5.后置++返回的是tmp值，而不是引用；则调用<<时，就要用const来修饰引用传递，和拷贝构造一样，保证值不能修改；
		//一般来说，只要是引用的话，都加上const；
	cout << myInt++ << endl;//2 --> 2
	cout << myInt << endl;//2 --> 3

	int a = 10;
	cout << ++(++a) << endl;//10 --> 12
	cout << a << endl;//12 --> 12
}

//main279：前置后置自增自减运算符重载
int main279()
{
	testInDecrease();

	system("pause");
	return EXIT_SUCCESS;
}